package viper

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

type YamlConfig struct {
	Qq      Qq      `yaml:"qq"`
	Wechat  Wechat  `yaml:"wechat"`
	ChatGpt ChatGpt `yaml:"chatGpt"`
}
type Qq struct {
	GroupIds []int64 `yaml:"groupIds"`
}
type Wechat struct {
	GroupNickNames []string `yaml:"groupNickNames"`
}

type ChatGpt struct {
	ApiKey       string `json:"apiKey"`
	ChatGptModel string `json:"chatGptModel"`
}

var Config *YamlConfig

func init() {
	// https://www.modb.pro/db/147021
	// viper 优先级
	// 显示使用Set函数设置值 > flag：命令行参数 > env：环境变量 > config：配置文件 > key/value store：key/value存储系统，如(etcd) > default:默认值

	viperConfig := viper.New()

	// 设置配置文件名，没有后缀
	viperConfig.SetConfigName("app")
	// 设置读取文件格式为:yaml
	viperConfig.SetConfigType("yml")
	// 设置配置文件目录(可以设置多个,优先级根据添加顺序来)
	// 先查找(.)当前目录下是否有app.yaml，如果没有则去(./go-viper-demo/)中查找
	// todo 注意不会合并多个配置文件的内容
	viperConfig.AddConfigPath("./zy_bot_demo")
	viperConfig.AddConfigPath(".")

	// 设置默认值
	//viperConfig.SetDefault("mysql.password", "1111111")
	//viperConfig.SetDefault("mysql.user", "blue7")

	// 读取解析
	err := viperConfig.ReadInConfig()
	if err != nil {
		fmt.Println("error")
		return
	}
	// 注册别名
	//viperConfig.RegisterAlias("auther", "mysql.Username")

	// 动态修改
	// 启动服务后，访问:http://127.0.0.1:8080/update-config, 之后修改配置文件，保存后刷新浏览器器，会发现配置已经修改。无需重启,即可生效！
	viperConfig.WatchConfig()
	viperConfig.OnConfigChange(func(e fsnotify.Event) {
		// 配置动态改变时，回调函数
		fmt.Printf("配置发生改变,重新解析配置:%v\n", e.Name)
		err1 := viperConfig.Unmarshal(&Config)
		if err1 != nil {
			fmt.Println(err1)
			return
		}
	})

	// 映射到结构体中
	err1 := viperConfig.Unmarshal(&Config)
	if err1 != nil {
		fmt.Println(err1)
		return
	}
	//fmt.Printf("App:%+v\n", Config.App)
	//fmt.Printf("Mysql:%+v\n", Config.Mysql)
	fmt.Printf("---------\n")
	// todo GetString 貌似不支持及联操作
	//fmt.Printf(viperConfig.GetString("mysql.Username"))
}
